package com.atguigu.gmall.order.service;

import com.atguigu.gmall.enums.model.ProcessStatus;
import com.atguigu.gmall.order.model.OrderInfo;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.baomidou.mybatisplus.extension.service.IService;

import java.util.Map;

/**
 * 订单表 订单表 业务接口类
 *
 * @author atguigu
 * @since 2023-08-10
 */
public interface OrderInfoService extends IService<OrderInfo> {

    /**
     * 当前用户-汇总订单确认所需要数据
     *
     * @return
     */
    Map<String, Object> getOrderTadeData(Long userId);

    /**
     * 订单提交,跟后续支付业务对接
     *
     * @param orderInfo
     * @param tradeNo
     * @return
     */
    Long submitOrder(OrderInfo orderInfo, String tradeNo);

    /**
     * 保存订单以及订单明细
     *
     * @param orderInfo
     * @param orderType "1":普通商城订单 "2":秒杀订单
     * @return
     */
    Long saveOrder(OrderInfo orderInfo, String orderType);


    /**
     * 生成流水号
     *
     * @param userId
     * @return
     */
    String generateTradeNo(Long userId);


    /**
     * 验证流水号是否一致
     *
     * @param userId
     * @param tradeNo
     * @return
     */
    Boolean checkTradeNo(Long userId, String tradeNo);


    /**
     * 删除业务流水号
     *
     * @param userId
     */
    void deleteTradeNo(Long userId);


    /**
     * 验证商品库存方法
     *
     * @param skuId
     * @param num
     * @return
     */
    Boolean checkStock(Long skuId, int num);

    /**
     * 分页查询当前用户订单
     *
     * @param page
     * @param limit
     * @return
     */
    Page<OrderInfo> getOrderList(String userId, int page, int limit);

    /**
     * 执行订单状态验证以及订单关闭
     *
     * @param orderId
     */
    void execExpireOrder(Long orderId);

    /**
     * 复用方法，将指定订单修改为指定状态
     * @param orderId
     * @param processStatus
     */
    void updateOrderStatus(Long orderId, ProcessStatus processStatus);

    /**
     * 发送MQ消息通知库存系统锁定库存
     * @param orderId
     */
    void sendLockStockMsg(Long orderId);

    /**
     * 根据订单ID查询订单信息(订单明细)
     *
     * @param orderId
     * @return
     */
    OrderInfo getOrderInfo(Long orderId);

    /**
     * 根据库存系统反馈进行拆单
     * @param orderId 订单ID
     * @param wareSkuMap 仓库跟商品Sku列表映射关系
     * @return
     */
    String orderSplit(Long orderId, String wareSkuMap);

    /**
     * 保存秒杀订单
     * @param orderInfo
     * @return
     */
    Long submitSeckillOrder(OrderInfo orderInfo);
}
